/**
 * @description 创建一个组成对象，key（键）是经过 iteratee（迭代函数）执行处理collection中每个元素后返回的结果，每个key
 * （键）对应的值是 iteratee（迭代函数）返回该key（键）的次数（注：迭代次数）。iteratee 调用一个参数：(value)
 * @param {Array|Object} collection 一个用来迭代的集合
 * @param {Array|Function|Object|string} iteratee 一个迭代函数，用来转换key（键）
 * @returns {Object} 一个对象，其中键是iteratee的结果，值是该结果出现的次数
 * @example
 * countBy([6.1, 4.2, 6.3], Math.floor);
 * => { '4': 1, '6': 2 }
 * countBy(['one', 'two', 'three'], 'length');
 * => { '3': 2, '5': 1 }
 */
function countBy(collection, iteratee) {
    // 创建一个空对象 result，用于存储计数结果
    const result = {};
    // 遍历 collection 中的每个元素
    for (const item of collection) {
        // 调用 iteratee 函数获取每个元素的键值
        const key = iteratee(item);
        // 如果 result 对象中已存在该键值，则将对应的值加1；否则，将该键值设为1，并赋给 result 对象
        result[key] ? result[key]++ : (result[key] = 1);
    }
    // 返回结果对象 result
    return result;
}